#ifndef DYNAMICLAYOUT_H
#define DYNAMICLAYOUT_H

#include <QObject>
#include <QGridLayout>
#include <QWidget>
#include <QHash>
#include <QEvent> // 添加QEvent头文件包含

/**
 * @brief 布局策略抽象接口，定义控件排列规范
 * @details 采用策略模式实现，支持动态切换布局方式[3]
 */
class LayoutStrategy {
public:
    virtual ~LayoutStrategy() = default;

    /**
     * @brief 排列控件核心方法
     * @param layout 目标布局容器
     * @param widgets 待排列控件集合
     */
    virtual void arrangeWidgets(QGridLayout* layout, const QList<QWidget*>& widgets) = 0;

    /**
     * @brief 获取控件坐标映射规则
     * @param index 控件索引
     * @return 对应的行列坐标(QPoint.x=行, QPoint.y=列)
     */
    virtual QPoint getWidgetPosition(int index, int totalCount) const = 0;
};

/**
 * @brief 单行线性排列策略（1xN布局）
 * @details 所有控件排列在单行，按添加顺序从左到右排列
 */
class LinearStrategy : public LayoutStrategy {
public:
    void arrangeWidgets(QGridLayout* layout, const QList<QWidget*>& widgets) override;
    QPoint getWidgetPosition(int index, int totalCountx) const override;
};


/**
 * @brief 网格排列策略（2x2布局）
 * @details 控件按行优先顺序填充2列网格，适用于多控件场景
 */
class GridStrategy : public LayoutStrategy {
public:
    void arrangeWidgets(QGridLayout* layout, const QList<QWidget*>& widgets) override;
    QPoint getWidgetPosition(int index, int totalCount) const override;
};





// 自动网格策略类：根据控件数量自动计算最佳列数的网格布局
class AutoGridStrategy : public LayoutStrategy {
public:
    /**
     * @brief 自动排列控件到网格布局
     * @param layout 目标网格布局对象
     * @param widgets 需要排列的控件列表
     *
     * 算法特点：
     * 1. 基于控件总数的平方根计算初始列数
     * 2. 对完美平方数进行列数优化
     * 3. 保持行数最少优先的排列方式
     */
    void arrangeWidgets(QGridLayout* layout, const QList<QWidget*>& widgets) override;

    /**
     * @brief 获取指定索引控件的位置
     * @param index 控件索引
     * @param totalCount 控件总数
     * @return 控件在网格中的坐标(QPoint(row, column))
     *
     * 注意：需要保持与arrangeWidgets相同的计算逻辑
     */
    QPoint getWidgetPosition(int index, int totalCount) const override;
};



// 单一显示策略类：显示当前选中的窗口
class OneGridStrategy : public LayoutStrategy {
public:
    void arrangeWidgets(QGridLayout* layout, const QList<QWidget*>& widgets) override;
    QPoint getWidgetPosition(int index, int totalCount) const override;

};




/**
 * @brief 智能动态布局容器
 * @details 根据控件数量自动切换布局策略，支持控件选择事件
 */
class DynamicLayout : public QGridLayout {
    Q_OBJECT
public:
    explicit DynamicLayout(QWidget* parent = nullptr);
    ~DynamicLayout();

    enum LayoutMode {One, Linear, Grid, AutoGrid}; // 布局模式枚举

    using QGridLayout::addWidget; // 显式引入基类所有重载
    // 控件管理接口
    void addManagedWidget(QWidget* widget);// 自定义方法（避免命名冲突）
    void removeManagedWidget(QWidget* widget);

    // 状态查询接口
    QPoint getWidgetPosition(QWidget* widget) const;
    QWidget* selectedWidget() const;
    //    QWidget* selectedWidget() const { return m_selectedWidget; }

    void clearLayout(QLayout *layout, bool deleteWidgets = false);

    // 单一显示标志位
    void setOneLayoutFlag(bool OneLayoutFlag);
    bool getOneLayoutFlag() const;

    QWidget *getSelectedWidget() const; // 获取当前选中的窗口



signals:
    void selectionChanged(QWidget* selected); // 控件选中事件

public slots:
    void do_selectedWidget(QWidget *seleWidget);

protected:
    bool eventFilter(QObject* watched, QEvent* event) override;

private:
    static constexpr char SELECTED_STYLE[] = "QWidget[selected=true]"; // 属性选择器

    void updateLayout();          // 布局更新触发器
    LayoutMode calculateLayoutMode() const; // 布局策略决策器
    void reorganizeLayout();      // 实际布局重构方法
    LayoutStrategy* currentStrategy() const;
//    LayoutStrategy* currentStrategy() const { return m_strategies[m_currentMode]; }

    QHash<LayoutMode, LayoutStrategy*> m_strategies; // 策略对象池
    LayoutMode m_currentMode;     // 当前布局模式
    QList<QWidget*> m_widgets;     // 托管控件集合
    QWidget* m_selectedWidget;     // 当前选中控件

    const int MAX_WIDGET = 4;  // 最大图表数量

    bool m_OneLayoutFlag = false;   // 单一显示标志位
};

#endif // DYNAMICLAYOUT_H
